计算机组成与设计实训 您所在的位置:网站首页 verilog 电平触发 计算机组成与设计实训

计算机组成与设计实训

2023-05-17 19:51| 来源: 网络整理| 查看: 265

Verilog(知识&实验)

Author: Peter Han

计算机组成与设计实训-用 Verilog HDL 玩转计算机硬件系统设计 (educoder.net)

// Verilog HDL 模块的模板(仅考虑用于逻辑综合的程序) module(); output 输出端口列表; input 输入端口列表; //(1)使用assign语句定义逻辑功能 wire; assign=表达式; //(2)使用always块定义逻辑功能 always@() begin //过程赋值语句 //if语句 //case语句 //while,repeat,for循环语句 //task,function调用 end endmodule //(3)元件例化 assign

赋值语法以关键字assign开头,后面是信号名,可以是单个信号,也可以是不同信号网的连接。驱动强度和延迟是可选的,主要用于数据流建模,而不是综合到实际硬件中。右侧的表达式或信号被分配给左侧的网或网的表达式。

语法结构如下:

assign = [drive_strength] [delay]

延迟值对于指定门的延迟很有用,并用于模拟实际硬件中的时序行为,因为该值决定了何时应该用评估值分配网。

使用 assign 语句时, 需要遵循一些规则:

LHS(左值) 应该始终是wire类型的标量或向量网络, 或者标量或矢量网络的串联, 而绝对不能是reg类型的标量或矢量寄存器。RHS 可以包含标量或向量寄存器以及函数调用。只要 RHS 上的任何操作数的值发生变化, LHS 就会使用新值进行更新。assign 语句也称为连续赋值, 并且始终处于活动状态

reg类型的变量不能使用assign进行连续赋值,这是因为reg类型的变量可以存储数据,并且不需要连续驱动。我们只能在initial以及always块内对reg类型变量进行赋值。

always

在满足always后面括号内的条件时,执行always内的代码。

always时间控制:沿触发或电平触发

单个信号或多个信号(中间用关键词or连接) 1、沿触发

功能:常用于描述时序行为。e.g.有限状态机

2、电平触发

功能:常用于描述组合逻辑行为

关于always的一些说明 1、一个模块中可有多个always块,并行运作 2、若always块可综合,则表示的是某种结构;若always块不可综合,则表示的电路结构的行为

需要注意的地方 1、assign不能在always中使用 2、assign和实例应用可独立于过程块存在

在Verilog中,设计组合逻辑和时序逻辑时,都要用到always:

always @(*) //组合逻辑 if(a > b) out = 1; else out = 0; always @(posedge clk) //时序逻辑 flip-flop触发器 if(en) out >”和“>>>”,左移同理。

两者的区别在于:逻辑移位不考虑符号位,左移和右移都只补零;算术移位考虑符号位,左移补零,右移补符号位。

reg

①在物理结构上相对比较麻烦,左端有一个输入端口D,右端有一个输出端口Q, 并且 reg 型存储数据需要在CLK(时钟)沿的控制下完成,在 Verilog HDL 描述时也相对麻烦。在对reg型变量进行赋值时,必须在 always 块内完成。

②reg型变量是最常用的variable型变量,variable型变量必须放在过程语句(如initial、 always) 中,通过过程赋值语句赋值;在always、initial等过程块内被赋值的信号也必须定义成variable型。variable型变量(reg)并不意味着一定对应着硬件上的一个触发器或寄存器等存储元件,在综合器进行综合时,综合器会根据具体情况确定是映射成连线还是映射为存储元件(触发器或寄存器)。

reg[31:0] q; “!“和”~”

“!”表示逻辑取反,“~”表示按位取反

“{}”

{}的基本使用是两个,一个是拼接,一个是复制。

{ }表示拼接,{第一位,第二位…};{{ }}表示复制,{4{a}}等同于{a,a,a,a}; 所以{13{1‘b1}}就表示将13个1拼接起来,即13’b1111111111111。 posedge/negedge posedge:上升沿negedge:下降沿posedge or negedge:时钟信号有变化

用法:

// 1. always @ (negedge clk) begin // 2. always @ (posedge clk) begin // 3. always @ (posedge clk or negedge clrn) begin clk/clrn

clk为时钟信号输入端,上升沿触发;clrn为异步清零信号输入端,clrn=0时清零。

e.g.

module dffe 32 (d, clk, clrn, e, q); case case(控制表达式/值) 分支表达式:执行语句 default:执行语句 endcase

自上而下,按照顺序逐个对分支表达式进行判断,如果这一分支表达式等于控制表达式的值,就执行其对应操作;均不相等时,执行default操作。

e.g.

case(s) 2'b00: select = a0; 2'b01: select = a1; 2'b10: select = a2; 2'b11: select = a3; endcase

在case语句中,敏感表达式中与各项值之间的比较是一种全等比较,每一位都相同才认为匹配。

在casez语句中,如果分支表达式某些位的值为高阻z,那么对这些位的比较就会忽略,不予考虑,而只关注其他位的比较结果。

在casex语句中,则把这种处理方式进一步扩展到对x的处理,即如果比较双方有一方的某些位的值是z或x,那么这些位的比较就不予考虑。

数据表示

计算位宽时,都要转成二进制来计算,因为时序元件只能存储二值电平。

对于4’h0,由于是这里的0是十六进制的,它表示二进制的4’b0000,所以是四位的。

对于16’h4012,每个数字表示4位,一共4个数字,所以一共是4*4=16位。

总结:$ (num1)'(letter)(num2)$:

num1:表示位宽

letter:一个字母,代表不同进制

b:二进制h:十六进制

num2:表示具体的数据

= 与 >sa:逻辑移位 end else sh = d>>sa; end else if(!right&&arith) sh=d


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有